package com.sun.module_network.utils

import com.sun.module_network.utils.CharacterHandler.Companion.jsonFormat
import com.sun.module_network.utils.UrlEncoderUtils.Companion.hasUrlEncoded
import okhttp3.MediaType
import okhttp3.Request
import okio.Buffer
import java.io.IOException
import java.io.UnsupportedEncodingException
import java.net.URLDecoder
import java.nio.charset.Charset
import java.util.Locale

/**
 *@author:sunc
 *@time :2025/7/18 15:02
 *@desc: 描述
 */
object HttpLogUtils {
    /**
     * 解析请求服务器的请求参数
     *
     * @param request [Request]
     * @return 解析后的请求信息
     * @throws UnsupportedEncodingException
     */
    @Throws(UnsupportedEncodingException::class)
    fun parseParams(request: Request): String {
        return try {
            val body = request.newBuilder().build().body ?: return ""
            val requestbuffer = Buffer()
            body.writeTo(requestbuffer)
            var charset = Charset.forName("UTF-8")
            val contentType = body.contentType()
            if (contentType != null) {
                charset = contentType.charset(charset)
            }
            var json = requestbuffer.readString(charset)
            if (hasUrlEncoded(json)) {
                json = URLDecoder.decode(
                    json,
                    convertCharset(charset)
                )
            }
            jsonFormat(json)
        } catch (e: IOException) {
            e.printStackTrace()
            "{\"error\": \"" + e.message + "\"}"
        }
    }

    /**
     * 是否可以解析
     *
     * @param mediaType [MediaType]
     * @return `true` 为可以解析
     */
    fun isParseable(mediaType: MediaType?): Boolean {
        return if (mediaType?.type == null) {
            false
        } else isText(mediaType) || isPlain(
            mediaType
        )
                || isJson(mediaType) || isForm(
            mediaType
        )
                || isHtml(mediaType) || isXml(
            mediaType
        )
    }

    fun isText(mediaType: MediaType?): Boolean {
        return if (mediaType?.type == null) {
            false
        } else "text" == mediaType.type
    }

    fun isPlain(mediaType: MediaType?): Boolean {
        return if (mediaType?.subtype == null) {
            false
        } else mediaType.subtype
            .lowercase(Locale.getDefault()).contains("plain")
    }

    @JvmStatic
    fun isJson(mediaType: MediaType?): Boolean {
        return if (mediaType?.subtype == null) {
            false
        } else mediaType.subtype.lowercase(Locale.getDefault()).contains("json")
    }

    @JvmStatic
    fun isXml(mediaType: MediaType?): Boolean {
        return if (mediaType?.subtype == null) {
            false
        } else mediaType.subtype.lowercase(Locale.getDefault()).contains("xml")
    }

    fun isHtml(mediaType: MediaType?): Boolean {
        return if (mediaType?.subtype == null) {
            false
        } else mediaType.subtype.lowercase(Locale.getDefault()).contains("html")
    }

    fun isForm(mediaType: MediaType?): Boolean {
        return if (mediaType?.subtype == null) {
            false
        } else mediaType.subtype.lowercase(Locale.getDefault())
            .contains("x-www-form-urlencoded")
    }

    fun convertCharset(charset: Charset?): String {
        val s = charset.toString()
        val i = s.indexOf("[")
        return if (i == -1) {
            s
        } else s.substring(i + 1, s.length - 1)
    }
}